﻿/*******************************************************
* Copyright (c) 2018-2088, By XuXiang all rights reserved.
*
* FileName: MatchModule.h
* Summary: 匹配模块。
*
* Author: XuXiang
* Date: 2024-04-24 21:51
*******************************************************/

#ifndef __MatchModule_h__
#define __MatchModule_h__

#include <Frame/ModuleBase.h>
#include <map>
#include "MatchInfo.h"
using namespace std;

namespace Competition
{
	struct NetDataItem;

	//登陆模块
	class MatchModule : public ModuleBase
	{
	public:
		//匹配一组需要的玩家数量
		static const int MATCH_GROUP_NUMBER;

		//准备等待时间
		static const int PREPARE_WAIT_TIME;

		//构造析构函数
		MatchModule();
		virtual ~MatchModule();

		//注册网络消息
		virtual void RegisterNetMessage(NetManagerBase *pMgr);

		//注册存储消息
		virtual void RegisterStorageMessage(StorageManager* pMgr);

		//初始化配置列表
		virtual void AddConfig(vector<ModuleConfig*> &cfgs);

		//初始化
		virtual void Init();

		//销毁
		virtual void Release();

		//秒更新
		virtual void OnUpdatePerSecond();

		//设置需要广播
		void SetBroadcastDirty() { m_BroadcastCount = m_BroadcastCount > 0 ? m_BroadcastCount : 10; }

		//广播玩家人数
		void BroadcastPlayerNumber();

	private:

		//检查准备组时间
		void CheckPrepareTime();

		//移除玩家
		void RemovePlayer(int user_id);

		void OnPlayerNumberRequest(NetDataItem* item);
		void OnMatchBeginRequest(NetDataItem* item);
		void OnMatchCancelRequest(NetDataItem* item);
		void OnMatchConfirmRequest(NetDataItem *item);

		EVENT_DEFINE(MatchModule, UserOnline);
		EVENT_DEFINE(MatchModule, UserOutline);
		EVENT_DEFINE(MatchModule, UserQuit);
		EVENT_DEFINE(MatchModule, FightIn);
		EVENT_DEFINE(MatchModule, FightOut);

		//广播计数
		int m_BroadcastCount;

		//当前要分配的组ID。
		int m_CurGroupID;

		//未匹配玩家
		MatchInfoMap m_FreeUsers;

		//等待匹配的列表。
		MatchInfoVector m_WaitMatchInfos;

		//准备中的匹配组。
		MatchGroupMap m_PrepareGroups;

		//用户id到组id的映射查询。
		std::map<int, int> m_UserToGroup;

		//匹配完成的用户。
		MatchInfoMap m_CompleteUsers;
	};
}

#endif